package models

import (
	"database/sql"
	"errors"
	"image-sever-grpc/image-web-server/config"
	"image-sever-grpc/image-web-server/dao/model"
)

// FindOrCreateByWpsUID 查找或创建用户
func FindOrCreateByWpsUID(wpsUID, username string) (*model.User, error) {
	// 1. 先查询数据表中是否存在该用户
	user, err := GetUserByWpsUID(wpsUID)
	// 如果查询成功且用户存在，直接返回该用户（登录）
	if err == nil {
		return user, nil
	}
	// 如果是其他错误（非用户不存在），返回错误
	if err != sql.ErrNoRows {
		return nil, err
	}

	// 2. 若用户不存在，在表中插入新数据
	newUser := &model.User{
		WpsUID:   wpsUID,
		Username: username,
	}
	// 执行插入并获取自增ID
	id, err := CreateUser(newUser)
	if err != nil {
		return nil, err
	}
	// 设置ID并返回新创建的用户
	newUser.ID = id
	return newUser, nil
}

// checkUserExists 检查用户是否已存在（通过WpsUID）
func CheckUserExists(wpsUID string) (bool, error) {
	var count int
	// 假设DB是全局数据库连接
	err := config.DB.QueryRow(
		"SELECT COUNT(*) FROM users WHERE wps_uid = ?",
		wpsUID,
	).Scan(&count)
	if err != nil {
		return false, err
	}
	return count > 0, nil
}

// saveUserToDB 将新用户信息保存到数据库
func SaveUserToDB(user *model.User) error {
	_, err := config.DB.Exec(
		"INSERT INTO users (wps_uid, username, created_at, updated_at) VALUES (?, ?, NOW(), NOW())",
		user.WpsUID,
		user.Username,
	)
	return err
}

// GetUserByWpsUID 通过金山UID查询用户
func GetUserByWpsUID(wpsUID string) (*model.User, error) {
	var user model.User
	err := config.DB.QueryRow(
		`SELECT id, wps_uid, username, created_at, updated_at 
		 FROM users WHERE wps_uid = ?`,
		wpsUID,
	).Scan(
		&user.ID, &user.WpsUID, &user.Username,
		&user.CreatedAt, &user.UpdatedAt,
	)
	if err == sql.ErrNoRows {
		return nil, errors.New("用户不存在")
	}
	return &user, err
}

// CreateUser 创建用户（通过金山登录回调）
func CreateUser(user *model.User) (int64, error) {
	result, err := config.DB.Exec(
		`INSERT INTO users (wps_uid, username, created_at, updated_at) 
		 VALUES (?, ?, NOW(), NOW())`,
		user.WpsUID, user.Username,
	)
	if err != nil {
		return 0, err
	}
	return result.LastInsertId()
}

// GetUserByID 通过ID查询用户（服务层依赖）
func GetUserByID(id int64) (*model.User, error) {
	var user model.User
	err := config.DB.QueryRow(
		`SELECT id, wps_uid, username, created_at, updated_at 
		 FROM users WHERE id = ?`,
		id,
	).Scan(
		&user.ID, &user.WpsUID, &user.Username,
		&user.CreatedAt, &user.UpdatedAt,
	)
	if err == sql.ErrNoRows {
		return nil, errors.New("用户不存在")
	}
	return &user, err
}
